perm filename PPCODE.SAI[PNT,HE]12 blob
sn#521563 filedate 1980-07-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY
C00012 ENDMK
C⊗;
ENTRY;
BEGIN "PPCODE"
DEFINE $$PRGID=TRUE, $PPCODE=TRUE;
REQUIRE "HEADER.SAI" SOURCE_FILE;
REQUIRE "[][]" DELIMITERS;
REDEFINE MAKEOP(OPNUM,OPNAM,OPVAL)"[]" = [,"OPNAM"];
PRESET_WITH "not valid" INTOPS;
STRING ARRAY SPCODE[0:#ALINTOPS/2];
BOOLEAN TOTTY;
INTEGER OCHAN;
define #bmark= '240000;
define #emark= '020000;
DEFINE NONULLING_GBITS=1,
WOBBLE_GBITS=2,
SPEEDF_GBITS=4,
DURREL_GBITS='60; ! Duration relation present, which indicated by ;
DEFINE DURLB_GBITS='20; ! lower bound on duration ;
DEFINE DURUB_GBITS='40; ! upper bound on duration ;
DEFINE DUREB_GBITS='60; ! exact bound ;
DEFINE VELOC_GBITS='100,
TCODE_GBITS='200,
VIAPT_GBITS='400,
DEPRPT_GBITS='1000,
APPRPT_GBITS='2000,
NODEPR_GBITS='4000; ! No departure point ;
DEFINE DESTPT_GBITS='10000;
SIMPLE STRING PROCEDURE SCODE(INTEGER I);
IF I MOD 2 = 0 AND 0≤I≤#ALINTOPS THEN RETURN(SPCODE[I/2])
ELSE RETURN(SPCODE[0]);
SIMPLE PROCEDURE EMIT(STRING S);
IF TOTTY THEN OUTSTR(S) ELSE OUT(OCHAN,S);
RECURSIVE PROCEDURE PPRIN(INTEGER ARRAY RR; INTEGER SNUM,INDEXF; STRING INDENT);
BEGIN
! program to print out pcode from number form to pcode form;
INTEGER INDEX;
PROCEDURE RPRINT;
BEGIN "print real numbers"
EMIT(" "&CVF(RFVAL(RR[INDEX+1],RR[INDEX+2])));
INDEX←INDEX+2;
END;
PROCEDURE OPRINT;
"prints octal" EMIT(" "&CVOS(RR[INDEX←INDEX+1]));
PROCEDURE RDPRINT(INTEGER OFFSET(0));
"prints relative decimal"
BEGIN INTEGER I;
! if offset not specified then take wrt to current position ;
I←RR[INDEX←INDEX+1];
EMIT(" .");
IF I≥0 THEN EMIT("+");
EMIT(CVS(I)&"(D)");
EMIT(" {="&CVS(INDEX+OFFSET+RR[INDEX])&"(D)}");
END;
PROCEDURE DPRINT;
"prints decimal"
EMIT(" "&CVS(RR[INDEX←INDEX+1])&"(D)");
PROCEDURE NLPRINT;
"prints newline"
EMIT(CRLF&CVS(INDEX+1)&": "&INDENT);
PROCEDURE NPCODE;
BEGIN "prints new pcode"
INTEGER I,J;
NLPRINT; ! start new line;
I←RR[INDEX←INDEX+1]/2;
J←RR[INDEX] MOD 2;
IF J=0 AND 1≤I≤ARRINFO(SPCODE,2)
THEN EMIT(SPCODE[I])
ELSE if !debug and i*2≥#bmark then
emit("-> "&cvos(rr[index] land '17777)&" "&
cvs(rr[index←index+1])&"(D)")
else if !debug and #emark≤i*2<#bmark then
emit("<- "&cvos(rr[index] land '17777)&" "&
cvs(rr[index←index+1])&"(D)")
else EMIT(CVS(RR[INDEX])&"(D)");
IF J=0 THEN
CASE I OF
BEGIN
[XJUMP/2][XPRINT/2][XJUMPC/2][XFORCHK/2]
[XRJMP/2][XRJMPC/2][XRFRCHK/2][XRFOREND/2]
RDPRINT;
[XPRNTC/2]
BEGIN STRING S;
S←TAB&DQUOTE&(RR[INDEX←INDEX+1] LSH -8)&DQUOTE;
EMIT(S);
END;
[XPRNTI/2]
BEGIN STRING S; INTEGER CHAR,SS;
DPRINT;
I←INDEX;
S←TAB&DQUOTE;
DO BEGIN SS←RR[I←I+1];
S←S&(CHAR←SS LAND '377)&(CHAR←SS LSH -8);
END UNTIL CHAR=0;
INDEX←INDEX+RR[INDEX];
S←S&DQUOTE;
EMIT(S);
END;
[XPUSHSCI/2]
RPRINT;
[XMKVT/2][XMKRT/2]
BEGIN RPRINT;RPRINT;RPRINT;END;
[XMKTR/2]
BEGIN RPRINT;RPRINT;RPRINT; NLPRINT;
RPRINT;RPRINT;RPRINT; END;
[XARRLD/2]
BEGIN INTEGER I,J; RPTR(SYMBOL)SYM;
I←RR[INDEX+1];
OPRINT;DPRINT;
ARRYDIM(I,SYM);
IF SYM THEN
BEGIN
CASE RR[INDEX] OF
BEGIN [#SC] J←1;
[#VT] [#RT] J←3;
[#TR] [#FR] J←6;
[#EV] J←0
END;
FOR I←1 STEP 1 UNTIL ARRAYREC:#EL[SYMBOL:OBJECT[SYM]]*J
DO BEGIN NLPRINT;RPRINT; END;
END;
END;
[XAFFIX/2]
BEGIN
OPRINT; OPRINT; OPRINT;
IF RR[INDEX] LAND '2000 THEN OPRINT;
END;
[XAGTVAL/2][XACHNGE/2][XARTVAL/2]
BEGIN OPRINT; OPRINT; END;
[XPHALT/2][XPBREAK/2][XUBREAK/2]
BEGIN OPRINT;DPRINT;END;
[XRCASE/2]
BEGIN
INTEGER NCASES,I,J;
DPRINT; NCASES←ABS(RR[J←INDEX])+1;
FOR I←1 STEP 1 UNTIL NCASES DO
BEGIN NLPRINT; RDPRINT(1-I); END;
END;
[XGTBLK/2]
BEGIN
DPRINT;PPRIN(RR,INDEX+1,INDEX+RR[INDEX],INDENT&" ");
INDEX←INDEX+RR[INDEX];
NLPRINT; EMIT(CVS(RR[INDEX←INDEX+1])&"(D)");
END;
[XGTVAL/2][XCHNGE/2][XWHERE/2][XPUSHINTI/2][XKVAR/2]
[XRETURN/2][XPROC/2][XCMVAR/2][XPKVAR/2]
[XGATHER/2][XCMDSBL/2][XSTOP/2][XCHCMP/2]
[XPUSHOFFSET/2][XPAFFIX/2][XCMENBL/2][XTFRCST/2]
[XARRINI/2][XCMSKED/2][XGTCMP/2][XSSBRTN/2][XCOMPLY/2]
[XCNTRL/2]
OPRINT;
[XPTFRCST/2][XPCOMPLY/2]
OPRINT;
[XCENTER/2]
BEGIN
OPRINT; OPRINT; RDPRINT; RDPRINT;
END;
[XPDRIVE/2][XPBDRIVE/2]
BEGIN
OPRINT;OPRINT; OPRINT; RDPRINT; RDPRINT;
END;
[XPMOVE/2]
BEGIN INTEGER BITS,I;
DPRINT;
WHILE (BITS←RR[INDEX+1])>=VIAPT_GBITS DO
BEGIN
NLPRINT; OPRINT; OPRINT;
FOR I←TCODE_GBITS,DURREL_GBITS,VELOC_GBITS DO
IF (I LAND BITS) THEN OPRINT;
END;
BITS←RR[INDEX+1];
NLPRINT; OPRINT;
FOR I←WOBBLE_GBITS,SPEEDF_GBITS,DURREL_GBITS DO
IF (I LAND BITS) THEN OPRINT;
NLPRINT; OPRINT; RDPRINT; RDPRINT;
END;
[XMVAR/2]
BEGIN
IF RR[INDEX+1]=5 THEN BEGIN OPRINT;OPRINT;OPRINT; END;
DO OPRINT UNTIL RR[INDEX]=0;
END;
[XCMFIL/2]
BEGIN OPRINT; OPRINT;
IF RR[INDEX]=#CMFRC THEN OPRINT;
OPRINT; OPRINT;
END;
[XAPUSHOFFSET/2]
BEGIN OPRINT;OPRINT END;
[XGTINT/2][XGVALS/2][XCHNGS/2][XPUNFIX/2]
INDEX←INDEX;
[XOPERATE/2]
BEGIN OPRINT;OPRINT;OPRINT;OPRINT;RDPRINT;RDPRINT; END;
[XPSPROUT/2]
BEGIN INTEGER I,N;
DPRINT;
N←RR[INDEX];
FOR I←1 STEP 1 UNTIL N DO
BEGIN NLPRINT; RDPRINT(2-2*I);OPRINT; END;
NLPRINT; OPRINT;
END;
ELSE INDEX←INDEX
END;
END;
INDEX←SNUM-1;
WHILE INDEX<INDEXF DO NPCODE;
END;
PROCEDURE COMCODE(RPTR(EXPR$)EE;INTEGER SNUM);
BEGIN PPRIN(EXPR$:BODY[EE],SNUM,EXPR$:#BODY[EE],NULL);
EMIT(CRLF&CVS(EXPR$:#BODY[EE]+1)&":"&CRLF);
END;
INTERNAL PROCEDURE PPCODE(RPTR(EXPR$)EE;INTEGER SNUM(1));
BEGIN TOTTY←TRUE;
COMCODE(EE,SNUM);
TOTTY←FALSE;
END;
INTERNAL PROCEDURE PWCODE(RPTR(EXPR$)EE;INTEGER SNUM(1));
BEGIN TOTTY←FALSE;
OCHAN←ORAFILE("PPCODE.FOO",FF&$CLNSAVE&CRLF);
COMCODE(EE,SNUM);
CRAFILE(OCHAN);
TOTTY←TRUE;
END;
PROCEDURE PPPCODE;ppcode(null_record);
END;